本文是对这篇 diff 文档的翻译
对于上下文差异和长度较小的正常补丁,patch
可以检测 patch 中的行号何时是不正确的,并且会尝试找到应用每个 hunk 的正确位置。
第一次尝试时,patch
会使用 hunk 的原有行号加上或减去应用先前的 hunk 产生的偏移。如果这不是正确的位置,patch
会分别向前向后扫描来寻找和 hunk 中的上下文匹配的位置。
首先,patch
寻找上下文的所有行都能匹配上的位置。如果找不到这样的位置,并且 patch
读取的是上下文补丁或标准补丁,同时最大模糊参数(fuzz factor)被设置为大于等于1,
则 patch
会进行下一次扫描。本次扫描时,忽略(即不包含)上下文部分的第一行和最后一行。如果依然找不到合适的位置,且模糊参数大于等于2,则进行下一次扫描,
并忽略上下文的前两行和最后两行。如果依旧找不到且模糊参数更大,则会继续此过程。
--fuzz=lines
(-F lines
) 选项设置最大模糊参数为 lines
。这个选项仅对有上下文的补丁和标准化补丁生效。lines
代表在搜索应用 hunk 的位置时最大忽略的上下文行数。
注意,较大的模糊参数将会增加补丁应用出错的概率。默认的模糊参数为2。将其设置为超过 diff
上下文的值(一般为3)是没有意义的。
如果 patch
找不到应用 hunk 的位置,则它会将无法应用的 hunk 写入对应的拒绝文件(.rej)文件。无论补丁是什么格式,拒绝文件都会以上下文格式写入无法应用的 hunk。
拒绝文件中的行号与 patch 文件中的行号不同:它显示的是patch
认为失败的 hunk 在新文件中的大致位置。
如果使用了--verbose
选项,那么 patch
将会在运行结束时给出一些关于失败和成果的更详细的信息。如果应用 hunk 失败了,则会打印出 patch
认为 hunk 在新文件中应该在哪一行。
如果这与 diff 中指定的行号不一致,则会打印出偏移量。如果某个偏移量过大,则该 hunk 应用的位置可能是错误的。patch
还会指出它在应用时是否使用了模糊因子进行匹配。